#!/usr/bin/env python
# -*- coding:utf8 -*-

import logging
import logging.handlers


class Color(object):
    DEBUG = '\033[35m'
    INFO = '\033[32m'
    ERROR = '\033[31m'
    ENDC = '\033[0m'

    @classmethod
    def _deco(self, msg, color):
        return '%s%s%s' % (color, msg, self.ENDC)

    @classmethod
    def debug(self, msg):
        return self._deco(msg, self.DEBUG)
    @classmethod
    def info(self, msg):
        return self._deco(msg, self.INFO)
    @classmethod
    def error(self, msg):
        return self._deco(msg, self.ERROR)


class ConsoleLog:
    console_logger = logging.getLogger('console_logger')
    def __init__(self):
        self.console_logger.setLevel(level=logging.DEBUG)
        self.console_logger.addHandler(self.console_log())

    def console_log(self):
        console_handler = logging.StreamHandler()
        console_handler.setLevel(level=logging.DEBUG)
        console_formatter = logging.Formatter(fmt='[%(levelname)s] %(message)s')
        console_handler.setFormatter(fmt=console_formatter)
        return console_handler

    @classmethod
    def debug(self, msg):
        self.console_logger.debug(Color.debug(msg))

    @classmethod
    def info(self, msg):
        self.console_logger.info(Color.info(msg))

    @classmethod
    def warning(self, msg):
        self.console_logger.warning(msg)

    @classmethod
    def error(self, msg):
        self.console_logger.error(Color.error(msg))

    @classmethod
    def critical(self, msg):
        self.console_logger.critical(msg)


class FileLog:
    file_logger = logging.getLogger('file_logger')
    file_logger.setLevel(level=logging.INFO)
    def __init__(self, filename='default.log'):
        self.logfile = filename
        self.file_logger.addHandler(self.file_log())

    def file_log(self):
        file_handler = logging.handlers.RotatingFileHandler(
                filename=self.logfile,
                mode='a',
                maxBytes=10*1024*1024,
                backupCount=100)
        file_formatter = logging.Formatter(
                fmt='[%(asctime)s - %(levelname)s] %(message)s',
                datefmt='%Y-%m-%d %H:%M:%S')
        file_handler.setFormatter(fmt=file_formatter)
        return file_handler

    @classmethod
    def debug(self, msg, *args, **kwargs):
        self.file_logger.debug(msg, *args, **kwargs)

    @classmethod
    def info(self, msg, *args, **kwargs):
        self.file_logger.info(msg, *args, **kwargs)

    @classmethod
    def warning(self, msg, *args, **kwargs):
        self.file_logger.warning(msg, *args, **kwargs)

    @classmethod
    def error(self, msg, *args, **kwargs):
        self.file_logger.error(msg, *args, **kwargs)

    @classmethod
    def critical(self, msg, *args, **kwargs):
        self.file_logger.critical(msg, *args, **kwargs)


class MyLog(ConsoleLog, FileLog):
    def __init__(self, filename='default.log'):
        ConsoleLog.__init__(self)
        FileLog.__init__(self, filename)

    @classmethod
    def debug(self, msg):
        ConsoleLog.debug(msg)
        FileLog.debug(msg)

    @classmethod
    def info(self, msg):
        ConsoleLog.info(msg)
        FileLog.info(msg)

    @classmethod
    def warning(self, msg):
        ConsoleLog.warning(msg)
        FileLog.warning(msg)

    @classmethod
    def error(self, msg):
        ConsoleLog.error(msg)
        FileLog.error(msg)
